定期ミートアップ 第72回
VTableとは
仮想関数の呼び出しに使うやつ
code:sk
class Shape
def draw; ...; end
end
class Rect : Shape; def draw; ...; end
class Circle : Shape; def draw; ...; end
shapes.each{|x| x.draw} # どっちのdrawが呼ばれるかは実行時まで決まらない
仕組み
Shiikaではあるクラスのメソッド一覧は静的に決まるので、その関数ポインタを一覧で持っておく(vtable)
各オブジェクトは自分のクラスのvtableへの参照をもつ
(今は直接持っているが、object→class→vtableという2段の参照にしてもよいかも。メモリ効率は上がる。仮想呼び出しの実行効率は落ちる(たぶん))
drawが13番だとしたら、「一覧の13番目の関数を呼ぶ」を実行時に行う
面倒なところ
分割コンパイル対応
./a.skにMainクラスがあるとして
./a.ll
@shiika_vtable_Main
これを計算するにはObjectのメソッド一覧が必要
~/.shiika/packages/core-0.1.0/lib/exports.json
クラス、メソッド、
~/.shiika/packages/core-0.1.0/lib/index.ll
./packages/coreをコンパイルしたもの
@shiika_vtable_Object
クラス階層